
;INCLUDE <formula$dir>.function_h
 
;DECLARE CHAR R2[]


;FUNCTION VOID printf(CHARPTR string,...)

   ;LET errorflag=0
   ;LET R6=0
   ;LET R1=&string-4
   ;LET R2=string
   ;FOR R0=0;R0<strlen(string);R0=R0+1
      ;IF R2[R0]=='%'
         ;IF R2[R0+1]=='c'
            ;LET putc(*R1)
            ;LET R1=R1-4
         ;ELSEIF R2[R0+1]=='d'
            ;LET writeint(*R1)
            ;LET R1=R1-4
         ;ELSEIF R2[R0+1]=='h'
            ;LET writeinthex(*R1)
            perror
            ;LET R1=R1-4
         ;ELSEIF R2[R0+1]=='s'
            ;LET writestr(*R1)
            ;LET R1=R1-4
         ;ELSEIF R2[R0+1]=='%'
            ;LET putc('%')
         ;ENDIF
         ;LET R0=R0+1
      ;ELSEIF R2[R0]=='\'
            ;IF R2[R0+1]=='n'
               ;LET cr()
            ;ELSEIF R2[R0+1]=='\'
               ;LET putc('\')
            ;ENDIF
         ;LET R0=R0+1
      ;ELSE
         ;LET putc(R2[R0])
      ;ENDIF
      ;IF errorflag!=0
         ;LET R6=1
      ;ENDIF
   ;ENDFOR
   ;IF R6==1
      ;LET errorflag=1
   ;ENDIF

;ENDFUNCTION   


;FUNCTION VOID readfstr(CHARPTR buffer,INT maxlen)

   ;LET R6=1
   ;SAVE R1
   ;FOR R0=0;(R0<maxlen-1) && (R6==1);R0=R0+1
      ;LET R1=getc()
      ;IF R1==13
         ;LET R0=R0-1
         ;LET R6=0
      ;ELSE
         ;LET putc(R1)
         ;LET buffer[R0]=R1
      ;ENDIF
   ;ENDFOR
   ;LET buffer[R0]=0
;ENDFUNCTION

;FUNCTION VOID inputf(CHARPTR string,...)

;CHAR hexstring[20]

   ;LET errorflag=0
   ;LET R6=0
   ;LET R1=&string-4
   ;LET R2=string
   ;SAVE R3
   ;FOR R0=0;R0<strlen(string);R0=R0+1
      ;IF R2[R0]=='%'
         ;IF R2[R0+1]=='c'
            ;LET R3=getc()
            ;LET putc(R3)
            ;LET *(CHARPTR)*R1=R3
            ;LET R1=R1-4
         ;ELSEIF R2[R0+1]=='d'
            ;LET readfstr(hexstring,19)
            ;LET **R1=string2int(hexstring);
            ;LET R1=R1-4
         ;ELSEIF R2[R0+1]=='h'
            ;LET hexstring[0]='&'
            ;LET readfstr(hexstring+1,11)
            ;LET **R1=string2int(hexstring);
            ;LET R1=R1-4
         ;ELSEIF R2[R0+1]=='s'
            ;LET readfstr(*R1,0x7FFFFFFF)
            ;LET R1=R1-4
         ;ELSEIF R2[R0+1]=='%'
            ;LET putc('%')
         ;ENDIF
         ;LET R0=R0+1
      ;ELSEIF R2[R0]=='\'
         ;IF R2[R0+1]=='n'
            ;LET cr()
            ;LET R0=R0+1
         ;ELSEIF R2[R0+1]=='\'
            ;LET putc('\')
            ;LET R0=R0+1
         ;ENDIF
      ;ELSE
         ;LET putc(R2[R0])
      ;ENDIF
      ;IF errorflag!=0
         ;LET R6=1
      ;ENDIF
   ;ENDFOR
   ;IF R6==1
      ;LET errorflag=1
   ;ENDIF

;ENDFUNCTION   


;FUNCTION VOID fwritestr(INT filehandle,CHARPTR string)
   ;FOR R0=0;R0<strlen(string);R0=R0+1
      ;LET bput(filehandle,string[R0])
   ;ENDFOR
;ENDFUNCTION

;FUNCTION VOID fprintf(INT filehandle,CHARPTR string,...)

   ;LET errorflag=0
   ;LET R6=0 
   ;LET R1=&string-4
   ;LET R2=string
   ;SAVE R3
   ;FOR R0=0;R0<strlen(string);R0=R0+1
      ;IF R2[R0]=='%'
         ;IF R2[R0+1]=='c'
            ;LET bput(filehandle,*R1)
            ;LET R1=R1-4
         ;ELSEIF R2[R0+1]=='d'
            ;LET R3=int2string(*R1)
            ;LET fwritestr(filehandle,R3)
            ;LET R1=R1-4
         ;ELSEIF R2[R0+1]=='h'
            ;LET R3=int2hexstring(*R1)
            ;LET fwritestr(filehandle,R3)
            ;LET R1=R1-4
         ;ELSEIF R2[R0+1]=='s'
            ;LET fwritestr(filehandle,*R1)
            ;LET R1=R1-4
         ;ELSEIF R2[R0+1]=='%'
            ;LET bput(filehandle,'%')
         ;ENDIF
         ;LET R0=R0+1
      ;ELSEIF R2[R0]=='\'
            ;IF R2[R0+1]=='n'
            ;LET bput(filehandle,10)
            ;ELSEIF R2[R0+1]=='\'
               ;LET bput(filehandle,'\')
            ;ENDIF
         ;LET R0=R0+1
      ;ELSE
         ;LET bput(filehandle,R2[R0])
      ;ENDIF
      ;IF errorflag!=0
         ;LET R6=1
      ;ENDIF
   ;ENDFOR
   ;IF R6==1
      ;LET errorflag=1
   ;ENDIF

;ENDFUNCTION   

;CHAR finputflastchar

;FUNCTION VOID freadfstr(INT filehandle,CHARPTR buffer,INT maxlen)

   ;LET buffer[0]=0
   ;LET R0=0
   ;LET R6=1
   ;LET R5=1
   ;SAVE R1
   ;WHILE (!eof(filehandle)) && (R6==1) && (R5==1)
      ;LET R1=bget(filehandle)
      ;LET finputflastchar=R1
      ;IF (R1==10) || (errorflag==1)
         ;LET R6=0
      ;ENDIF
      ;IF (R1>' ') || (R1<0) 
         ;LET R5=0
      ;ENDIF
   ;ENDWHILE
   ;WHILE (!eof(filehandle)) && (R6==1) && (R0<maxlen)
      ;IF (R1<=' ') && (R1>=0) 
         ;LET R0=R0-1
         ;LET R6=0
      ;ELSE
         ;LET buffer[R0]=R1
         ;LET R1=bget(filehandle)
         ;LET finputflastchar=R1
         ;LET R0=R0+1
      ;ENDIF
   ;ENDWHILE
   ;LET buffer[R0+1]=0

;ENDFUNCTION

;FUNCTION VOID finputf(INT filehandle,CHARPTR string,...)

;CHAR hexstring[20]

   ;LET errorflag=0
   ;LET R6=0
   ;LET R1=&string-4
   ;LET R2=string
   ;SAVE R3
   ;FOR R0=0;R0<strlen(string);R0=R0+1
      ;IF R2[R0]=='%'
         ;IF R2[R0+1]=='c'
            ;LET R3=bget(filehandle)
            ;LET *(CHARPTR)*R1=R3
            ;LET R1=R1-4
         ;ELSEIF R2[R0+1]=='d'
            ;LET freadfstr(filehandle,hexstring,19)
            ;LET **R1=string2int(hexstring);
            ;LET R1=R1-4
         ;ELSEIF R2[R0+1]=='h'
            ;LET hexstring[0]='&'
            ;LET freadfstr(filehandle,hexstring+1,11)
            ;LET **R1=string2int(hexstring);
            ;LET R1=R1-4
         ;ELSEIF R2[R0+1]=='s'
            ;LET freadfstr(filehandle,*R1,0x7FFFFFFF)
            ;LET R1=R1-4
         ;ENDIF
         ;LET R0=R0+1
      ;ELSEIF (R2[R0]=='\') && (R2[R0+1]=='n') 
         ;LET R3=finputflastchar
         ;WHILE (R3!=10) && (!eof(filehandle)) && (errorflag==0)  
            ;LET R3=bget(filehandle)
         ;ENDWHILE
         ;LET R0=R0+1
      ;ENDIF
      ;IF errorflag!=0
         ;LET R6=1
      ;ENDIF
   ;ENDFOR
   ;IF R6==1 
      ;LET errorflag=1 
   ;ENDIF

;ENDFUNCTION   

 B formulajump3 

 ;FUNCTION VOID field(INT fieldnr,CHARPTR target,CHARPTR source)
     ;INT sourcei     
     ;INT targeti     
     ;INT fieldcount
     ;INT readyflag

     ;LET readyflag=0;
     ;LET target[0]=0;
     ;LET sourcei=0;
     ;LET targeti=0;
     ;LET fieldcount=1
     ;WHILE ! readyflag
        ;WHILE (source[sourcei]<=32) && (source[sourcei]!=0)
           ;LET sourcei=sourcei+1;
        ;ENDWHILE
        ;IF source[sourcei]==0
           ;LET readyflag=1;
        ;ELSE
           ;WHILE (source[sourcei]!=32) && (source[sourcei]!=0)
              ;IF fieldcount==fieldnr
                 ;LET readyflag=1;
                 ;LET target[targeti]=source[sourcei];
                 ;LET targeti=targeti+1;
              ;ENDIF     
              ;LET sourcei=sourcei+1
           ;ENDWHILE
           ;IF readyflag
              ;LET target[targeti]=0
           ;ELSE
              ;LET fieldcount=fieldcount+1
           ;ENDIF
        ;ENDIF
     ;ENDWHILE
 ;ENDFUNCTION    

;INSIDE

 ;DECLARE VOID wimp_system(CHARPTR commmandstring)
   .MACRO wimp_system
     LDR R0,[R12,#%2]
     SWI XWimp_StartTask
     errorcheck
   .ENDM

;DECLARE INT wimp_initialise(CHARPTR taskname)
 .MACRO wimp_initialise
  MOV R0,#200.
  INTconstload R1,4B534154
  LDR R2,[R12,#%2]
  SWI XWimp_Initialise
  errorcheck 
  MOV %1,R1
 .ENDM

;DECLARE VOID wimp_close(INT taskhandle)

 .MACRO wimp_close
  LDR R0,[R12,#%2]
  INTconstload R1,4B534154
  SWI XWimp_CloseDown
  errorcheck
 .ENDM

;OUTSIDE

;INT taskdata[64]

;FUNCTION INT wimp_poll(INTPTR taskdata)

  ;LET R1=taskdata
  MOV R0,#0
  SWI XWimp_Poll
  ;SAVE R0
  ;IF ( (R0==17) && ((taskdata[4]==0) || (taskdata[4]==8)) ) 
     ;RETURN 1
  ;ENDIF
  ;RETURN 0

;ENDFUNCTION

formulajump3 

;OUTSIDE

